package com.bcu.cn.onlineexamsystem.studentmanage.util;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 数据类型转换工具类
 */
public class DataTypeConverter {
    
    /**
     * 安全地将Object转换为Integer
     * @param obj 要转换的对象
     * @return Integer值，如果转换失败返回0
     */
    public static Integer toInteger(Object obj) {
        if (obj == null) {
            return 0;
        }
        
        if (obj instanceof Integer) {
            return (Integer) obj;
        }
        
        if (obj instanceof Long) {
            return ((Long) obj).intValue();
        }
        
        if (obj instanceof Double) {
            return ((Double) obj).intValue();
        }
        
        if (obj instanceof Float) {
            return ((Float) obj).intValue();
        }
        
        if (obj instanceof BigDecimal) {
            return ((BigDecimal) obj).intValue();
        }
        
        if (obj instanceof String) {
            try {
                return Integer.parseInt((String) obj);
            } catch (NumberFormatException e) {
                return 0;
            }
        }
        
        return 0;
    }
    
    /**
     * 安全地将Object转换为Long
     * @param obj 要转换的对象
     * @return Long值，如果转换失败返回0L
     */
    public static Long toLong(Object obj) {
        if (obj == null) {
            return 0L;
        }
        
        if (obj instanceof Long) {
            return (Long) obj;
        }
        
        if (obj instanceof Integer) {
            return ((Integer) obj).longValue();
        }
        
        if (obj instanceof String) {
            try {
                return Long.parseLong((String) obj);
            } catch (NumberFormatException e) {
                return 0L;
            }
        }
        
        return 0L;
    }
    
    /**
     * 安全地将Object转换为Double
     * @param obj 要转换的对象
     * @return Double值，如果转换失败返回0.0
     */
    public static Double toDouble(Object obj) {
        if (obj == null) {
            return 0.0;
        }
        
        if (obj instanceof Double) {
            return (Double) obj;
        }
        
        if (obj instanceof Integer) {
            return ((Integer) obj).doubleValue();
        }
        
        if (obj instanceof Long) {
            return ((Long) obj).doubleValue();
        }
        
        if (obj instanceof Float) {
            return ((Float) obj).doubleValue();
        }
        
        if (obj instanceof BigDecimal) {
            return ((BigDecimal) obj).doubleValue();
        }
        
        if (obj instanceof String) {
            try {
                return Double.parseDouble((String) obj);
            } catch (NumberFormatException e) {
                return 0.0;
            }
        }
        
        return 0.0;
    }
    
    /**
     * 安全转换为BigDecimal
     */
    public static BigDecimal toBigDecimal(Object value) {
        if (value == null) {
            return BigDecimal.ZERO;
        }
        
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        
        if (value instanceof Integer) {
            return new BigDecimal((Integer) value);
        }
        
        if (value instanceof Long) {
            return new BigDecimal((Long) value);
        }
        
        if (value instanceof Double) {
            return BigDecimal.valueOf((Double) value);
        }
        
        if (value instanceof Float) {
            return BigDecimal.valueOf((Float) value);
        }
        
        if (value instanceof String) {
            try {
                return new BigDecimal(value.toString());
            } catch (NumberFormatException e) {
                return BigDecimal.ZERO;
            }
        }
        
        return BigDecimal.ZERO;
    }
    
    /**
     * 安全地将Object转换为String
     * @param obj 要转换的对象
     * @return String值，如果转换失败返回空字符串
     */
    public static String toString(Object obj) {
        if (obj == null) {
            return "";
        }
        return obj.toString();
    }
    
    /**
     * 安全地将Object转换为LocalDateTime
     * @param obj 要转换的对象
     * @return LocalDateTime值，如果转换失败返回null
     */
    public static LocalDateTime toLocalDateTime(Object obj) {
        if (obj == null) {
            return null;
        }
        
        if (obj instanceof LocalDateTime) {
            return (LocalDateTime) obj;
        }
        
        if (obj instanceof String) {
            try {
                // 尝试多种日期格式
                String dateStr = (String) obj;
                DateTimeFormatter[] formatters = {
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd")
                };
                
                for (DateTimeFormatter formatter : formatters) {
                    try {
                        return LocalDateTime.parse(dateStr, formatter);
                    } catch (Exception e) {
                        // 继续尝试下一个格式
                    }
                }
                
                // 如果都失败了，尝试只解析日期部分
                if (dateStr.length() >= 10) {
                    return LocalDateTime.parse(dateStr.substring(0, 10) + " 00:00:00", 
                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                }
            } catch (Exception e) {
                return null;
            }
        }
        
        return null;
    }
} 